const { SerialPort } = require('serialport');
const { ReadlineParser } = require('@serialport/parser-readline');

const { on_set_rfid_judgment } = require('./utils/set-rfid-serial-port-2.cjs')

// 打印所有的串口列表
SerialPort.list().then(ports => {
  console.log('所有串口列表:');
  ports.forEach(port => {
    console.log(port.path);
  });
});

// 创建串口对象
const port = new SerialPort({
  path: 'COM11', // 串口路径，根据实际情况修改
  baudRate: 115200, // 波特率
  dataBits: 8,       // 数据位
  parity: 'none',    // 奇偶校验
  stopBits: 1,       // 停止位
  flowControl: 'none' // 流量控制
});


const onReadData = () => {
  portWrite(`A5 04 01 00 55 01`)
  setTimeout(() => {
    portWrite(`A5 04 01 00 60 F6`)
  }, 500);
}


setInterval(onReadData, 500 + 500);

// 十六进制字符串转字节数组
function hexStringToByteArray(hex) {
  const bytes = [];
  for (let i = 0; i < hex.length; i += 2) {
    bytes.push(parseInt(hex.substr(i, 2), 16));
  }
  return new Uint8Array(bytes);
}
function portWrite(data) {
  port.write(hexStringToByteArray(data.replace(/\s+/g, '')));
}



// 连接成功时的回调
port.on('open', () => {
  console.log('串口连接成功');
  // 发送停止
  onReadData()
});

// 存储数据池
const dataPool = [];

// 读取数据时的回调
port.on('data', (data) => {
  // const currentTime = new Date()
  // const timeString = `${currentTime.toLocaleString()}:${currentTime.getMilliseconds()}`
  // console.log(`${timeString}接收到的数据:`);
  // console.log(data);
  // 将接收到的数据存储起来,没满足指定长度进行截取,并删除
  dataPool.push(...data);
  parsePacket();
});

function parsePacket() {
  // 从 dataPool 截取 A5 开头的
  const startIndex = dataPool.findIndex(data => data === 0xA5);
  if (startIndex === -1) {
    return;
  }
  const len = dataPool[startIndex + 1];
  const endIndex = startIndex + len + 1;
  // 根据长度截取数据,截取到后进行处理
  console.log('dataPool', dataPool.length)
  const packetData = dataPool.splice(startIndex, endIndex);
  console.log('dataPool', dataPool.length)
  //
  if (len < 20) return


  // 提取数据包长度
  // 提取数据包长度


  // 提取数据部分（如果有）
  const data = packetData.slice(5, 5 + len - 4);





  const antennaNumber = packetData[7];
  if (antennaNumber === 0) return

  const epcIndex = 5
  const epcEndIndex = epcIndex + "E28068940000500F4525B42D".length
  const epc_data = data.slice(epcIndex, epcEndIndex);
  function byteArrayToHexString(bytes) {
    const str = bytes.map(byte => byte.toString(16).padStart(2, '0')).join(' ');
    // 去除空格并大写
    return str.replace(/\s+/g, '').toUpperCase();
  }


  const epc_data_str = byteArrayToHexString(epc_data);
  const rfid = epc_data_str.slice(0, -8);

  // console.log(hexString); // 输出转换后的十六进制字符串
  if (!rfid) return
  // 对 rfid 进行截取,去掉后面6位

  console.log('rfid', rfid);

  const config = {
    host: '192.168.1.1',
    port: 4001
  }


  const key = `${config.host}-${antennaNumber}`;
  const sendResult = {
    key,
    ip: config.host,
    port: config.port,
    antenna: antennaNumber,
    rfid: rfid,
  };



  on_set_rfid_judgment(sendResult)

  if (dataPool.length >= startIndex + 25) {
    console.log('再次执行')
    parsePacket()
  }

}


// 串口错误时的回调
port.on('error', (error) => {
  console.error('串口发生错误:', error);
});

// 关闭串口时的回调
port.on('close', () => {
  console.log('串口已关闭');
});

// 优雅地关闭串口
process.on('SIGINT', () => {
  console.log('\n正在优雅地关闭串口...');
  const data = "A504010060F6";
  port.write(data);
  port.close(() => {
    console.log('串口已关闭，程序退出');
    process.exit(0);
  });
});


module.exports = () => {
  console.log('----- start -----')
}